/**
 * <p>
 * 描述：
 * </p>

 * @package ：com.andy.demo.soap<br>
 * @author ：wanglongjie<br>
 */
package com.andy.demo.soap;

import java.util.List;

/**
 * <p>
 * 描述：封装SOAP 请求报文
 * </p>
 * 
 * @author wanglongjie<br>
 * @version v1.0 2017年7月28日上午10:43:47
 */
public class SoapRequestBody {
	/**
	 * 
	 * <p>
	 * 描述：封装Soap请求报文
	 * </p>
	 * 
	 * @Date 2017年7月28日上午10:46:18 <br>
	 * @param soapParam
	 *            SoapParam对象实例
	 * @return
	 */
	public static final String requestBody(SoapParam soapParam) {
		if (validateSoapParam(soapParam)) {
			throw new IllegalArgumentException("访问 WSDL地址、接口名、方法名不能为空！");
		}
		// 请求报文
		StringBuffer body = new StringBuffer(16);
		// 头部分
		body.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
				+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
				+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
				+ "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
				+ "<soap:Body>");

		// 中间部分
		String methodName = soapParam.getCallMethodName();
		String interfaceName = soapParam.getInterfaceName();
		// 中间部分-接口、方法开始
		body.append("<").append(methodName.trim());
		body.append(" xmlns=\"").append(interfaceName.trim()).append("\">");

		// 中间部分-参数
		List<String> paramNames = soapParam.getMethodParamNames();
		List<Object> paramValues = soapParam.getMethodParamValues();
		if (listIsNull(paramNames)) {
			// 没用定义参数名称，则使用默认的 arg
			if (!listIsNull(paramValues)) {
				String defaultParamName = "arg";
				for (int index = 0; index < paramValues.size(); index++) {
					body.append("<").append(defaultParamName).append(index)
							.append(">");
					body.append(paramValues.get(index));
					body.append("</").append(defaultParamName).append(index)
							.append(">");
				}
			}
		} else {
			// 不为空，检查 paramNames 和 paramValues 个数是否保持一致
			if (!listIsNull(paramValues)) {
				if (paramNames.size() != paramValues.size()) {
					throw new IllegalArgumentException("访问方法的参数名称与参数值 个数不一致！");
				}

				for (int index = 0; index < paramValues.size(); index++) {
					body.append("<").append(paramNames.get(index)).append(">");
					body.append(paramValues.get(index));
					body.append("</").append(paramNames.get(index)).append(">");
				}
			}
		}
		// 中间部分-接口、方法结束
		body.append("</" + methodName.trim() + ">");

		// 尾部分
		body.append("</soap:Body></soap:Envelope>");

		return body.toString();
	}

	/**
	 * 
	 * <p>
	 * 描述：验证 SOAP相关参数 是否为空
	 * </p>
	 * 
	 * @Date 2017年7月28日上午10:51:50 <br>
	 * @param soapParam
	 *            SOAP相关参数对象
	 * @return
	 */
	private static boolean validateSoapParam(SoapParam soapParam) {
		return isNull(soapParam.getWsdlLocation())
				&& isNull(soapParam.getInterfaceName())
				&& isNull(soapParam.getCallMethodName());
	}

	/**
	 * 
	 * <p>
	 * 描述：非空判断
	 * </p>
	 * 
	 * @Date 2017年7月28日上午10:50:09 <br>
	 * @param param
	 *            String对象
	 * @return
	 */
	private static boolean isNull(String param) {
		return param == null || param.trim().length() == 0;
	}

	/**
	 * 
	 * <p>
	 * 描述：判断List是否为空
	 * </p>
	 * 
	 * @Date 2017年7月31日上午10:46:52 <br>
	 * @param list
	 * @return
	 */
	private static boolean listIsNull(List<?> list) {
		return list == null || list.size() == 0;
	}

}
